package controllers;

import play.*;
import play.data.validation.Valid;
import play.mvc.*;

import java.text.SimpleDateFormat;
import java.util.*;

import controllers.Secure.Security;

import models.Requerimento;
import models.Usuario;
import models.Voto;

/**
 * 
 * @author Igor
 *
 */
@With(Secure.class)
public class Colegiado extends Controller {


	/**
	 * 	INDEX'S DOS HTML'S 
	 */

	/**
	 * index da tela para mostrar os requerimentos pendentes
	 * 
	 */
	public static void index() {
		List<Requerimento> a = getPendentes();
		render(a);
	}


	/**
	 * index da tela para o usuario e permitir alterar a senha
	 * 
	 */
	public static void index2(){
		Usuario usuario = Usuario.getUsuarioPorEmail(Security.connected());
		render(usuario);
	}

	/**
	 * index da tela para mostrar um requerimento
	 * @param req
	 */
	public static void indexConsultaRequerimento(long id,@Valid Requerimento req, boolean votando){
		render(id,req,votando);
	}

	/**
	 * index da tela para mostrar os requerimento encerrados
	 * @param req
	 */
	public static void indexEncerrados(){

		List<Requerimento> enc = getEncerrados();
		List <String> aa = new ArrayList<String>();

		for(int i = 0; i < enc.size();i++){

			if(enc.get(i).aprovado == 1)
			    aa.add("DEFERIDO");
			else
				aa.add("INDEFERIDO");
		}

		render(enc,aa);
	}

	public static void downloadUserPhoto(long id) {
		final Requerimento user = Requerimento.findById(id);
		notFoundIfNull(user);
		response.setContentTypeIfNotSet(user.photo.type());
		renderBinary(user.photo.get(), user.photoFileName);
	}
	
	/**
	 * 	FIM DOS INDEX'S DOS HTML'S 
	 */



	/**
	 * vota no requerimento
	 * @param req requerimenro que esta sendo votado
	 * @param voto decisao do usuario
	 */
	public static void votar(long id,boolean voto){
		Requerimento req = Requerimento.findById(id);
		//cria o voto no bd
		Voto votoNovo = new Voto(voto, req, Usuario.getUsuarioPorEmail(Security.connected()));
		votoNovo.validateAndSave();

		//se com o voto o requerimento for encerrado
		if(req.verificaEncerramento()){
			req.encerrado = 1;
			req.aprovado = 1;
			req.save();
			//deleta os votos
			Voto.deleteVotosRequeriento(req.id);
			informaFinalizacaoDoRequerimento(req);
		}

		index();
	}



	public static void informaFinalizacaoDoRequerimento(Requerimento req){
		GeradorDeEmails a = new GeradorDeEmails();

		GeradorDePDF gerador = new GeradorDePDF();

		Usuario usuario = Usuario.getUsuarioCoordenador();

		try {

			//a.enviaEmail("glauco.sousa6@gmail.com", "HUUUUUUUUUUUUUUUU");

			boolean aa = req.aprovado == 1 ? true:false;
			String endereco = gerador.criarPDF(req,aa);

			if(aa){
				a.enviaEmailComAnexo(endereco, "glauco.sousa6@gmail.com", true);		
			}
			else
				a.enviaEmailComAnexo(endereco, "glauco.sousa6@gmail.com", false);		


			gerador.deletePDF(endereco);
			index();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


		//		try {
		//			
		//			gerador.criarPDF(this);
		//			a.enviaEmailComAnexo("C:\\Users\\Glauco\\Universidade\\MPS\\Projeto-MPS\\requerimentoaluno\\public\\Requerimento.pdf", "glauco.sousa6@gmail.com", this.aprovado==1?true:false);
		//			//a.enviaEmailComAnexo("public\\" + this.aluno+".pdf", usuario.email, this.aprovado==1?true:false);
		//			gerador.deletePDF(this);
		//		} catch (Exception e) {
		//			
		//			// TODO Auto-generated catch block
		//			e.printStackTrace();
		//		}finally{
		//			
		//			
		//			
		//		}




	}
	/**
	 * informa os requerimentos pendentes do referido membro do colegiado
	 * @return uma lista de requerimentos
	 */
	public static List<Requerimento> getPendentes(){
		Usuario usuario = Usuario.getUsuarioPorEmail(Security.connected());

		//pega todos os requerimentos nao encerrados
		List<Requerimento> pendentes = Requerimento.getPendentes();


		if(pendentes.size()>0 ){
			//pecorre a lista procurando requerimentos ja votados
			//			for (Requerimento requerimento : pendentes) {
			for(int i = 0; i<pendentes.size(); i++ ){
				//se ja votou eh retirado da lista
				if(pendentes.get(i).jaVotou(usuario)){
					pendentes.remove(i);
				}
			}//for
		}


		return pendentes;
	}


	/**
	 * informa os requerimentos que ja foram encerrados
	 * @return lista de requerimentos encerrados
	 */
	public static List<Requerimento> getEncerrados(){
		return Requerimento.getRequerimentosEncerrados();
	}


	/**
	 * altera a senha do usuario
	 * @param senha nova senha
	 * @param confirmacao confirmação da nova senha
	 * @return true se a alteração foi bem sucedida e false c.c.
	 */
	public static boolean alteraSenha(@Valid String senha, @Valid String confirmacao){

		//se as senhas estiverem corretas
		if(senha.hashCode() == confirmacao.hashCode()){ 
			Usuario user = Usuario.getUsuarioPorEmail(Security.connected());
			//altera a senha
			user.senhaHash = senha.hashCode();
			//salva no banco
			user.save();
	//		if(user.coordenador)
		//		Coordenador.index();
			//else
				//Colegiado.index();
			return true;
		}
		//as senhas estao diferentes
		else {
			return false;
		}
	}

	public static void alterar(String nome, String siape,String email, String senha, String confirmacao){

		Usuario usuario = Usuario.getUsuarioPorEmail(Security.connected());
		boolean equals =true;
		if(!usuario.email.equals(email))
			equals = false;
	
		
//				renderJSON("teste: " + usuario.id+" "+usuario.email+"\n"+email+"  "+ senha);
			//esta alterando a senha
			if(senha.length() != 0 && confirmacao.length() != 0){			
				usuario.email = email;
				//confere  senha
				if(senha.hashCode() == confirmacao.hashCode()){
					usuario.senhaHash = senha.hashCode();
				}
				usuario.nome = nome;
				usuario.siape = siape;
				//salva
				usuario.save();		
				if(equals)
					index();
				else{
					try {
						Secure.logout();
						Login.index();
					} catch (Throwable e) {
						e.printStackTrace();
					}
				}
			}
			//nao houve alteração da senha
			else{

				usuario.nome = nome;
				usuario.siape = siape;
				usuario.email = email;
				
				//salva
				usuario.save();
				if(equals){
					index();
				}
				else{
					try {
						
						Secure.logout();
						Login.index();
					} catch (Throwable e) {
						e.printStackTrace();
					}
				}
			}
		}
	/**
	 * altera o email do usuario
	 * @param email novo email	
	 */
	public static void alteraEmail(String email){
		Usuario user = Usuario.getUsuarioPorEmail(Security.connected());
		//altera o email
		user.email = email;
		//salva no banco
		user.save();
	}
	/**
	 * informa ao aluno que solicitou o requerimento o seu resultado
	 * @param requerimento requerimento finalizado
	 */
	public static void informaAluno(Requerimento requerimento){

		GeradorDeEmails a = new GeradorDeEmails();

		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
		//envia para o aluno
		String mensagem = "Prezado "+requerimento.aluno+", \n\nGostaríamos de informar que seu pedido encaminhado em "+ formatter.format( requerimento.date )+ "referente a "+ 
		requerimento.requerimento +"foi "
		+ (requerimento.isAprovado()?"deferido":"indeferido") +" pelo Colegiado deste Programa em "+formatter.format( requerimento.date )+"."+
		"\n\n\nAtenciosamente Coordenação PPGI.";

		a.enviaEmail(requerimento.email, mensagem);
	}


}
